From 55232abc7ec934d37f88e91119fd16f20e775277 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 23 Feb 2006 11:59:27 +0100 Subject: [PATCH] Rename XENFEAT_ring0_kernel to slightly more generic XENFEAT_supervisor_mode_kernel. Add comments in public header version.h to explain what all the different feature flags mean. Add a new flag XENFEAT_pae_pgdir_above_4gb to inform the guest that its PAE page directories do not need to conform to the usual hardware restriction. Signed-off-by: Keir Fraser --- .../arch/i386/kernel/head-xen.S | 2 +- .../arch/i386/mm/pgtable-xen.c | 9 ++++--- .../include/asm-i386/mach-xen/asm/segment.h | 4 +-- xen/common/kernel.c | 3 ++- xen/include/public/version.h | 26 ++++++++++++++++++- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S b/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S index a7cb4c8dd8..6d3bee09fc 100644 --- a/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S +++ b/linux-2.6-xen-sparse/arch/i386/kernel/head-xen.S @@ -182,7 +182,7 @@ ENTRY(_stext) .ascii ",FEATURES=writable_page_tables" .ascii "|writable_descriptor_tables" .ascii "|auto_translated_physmap" - .ascii "|ring0_kernel" + .ascii "|supervisor_mode_kernel" #ifdef CONFIG_X86_PAE .ascii ",PAE=yes" #else diff --git a/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c b/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c index 12d79adb64..923ad17df5 100644 --- a/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c +++ b/linux-2.6-xen-sparse/arch/i386/mm/pgtable-xen.c @@ -289,10 +289,11 @@ void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused) unsigned long flags; if (PTRS_PER_PMD > 1) { - /* Ensure pgd resides below 4GB. */ - int rc = xen_create_contiguous_region( - (unsigned long)pgd, 0, 32); - BUG_ON(rc); + if (!xen_feature(XENFEAT_pae_pgdir_above_4gb)) { + int rc = xen_create_contiguous_region( + (unsigned long)pgd, 0, 32); + BUG_ON(rc); + } if (HAVE_SHARED_KERNEL_PMD) memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD, diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/segment.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/segment.h index b736fbac7a..96a509c93e 100644 --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/segment.h +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/segment.h @@ -61,11 +61,11 @@ #define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE + 0) #define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8) -#define GET_KERNEL_CS() (__KERNEL_CS | (xen_feature(XENFEAT_ring0_kernel)?0:1) ) +#define GET_KERNEL_CS() (__KERNEL_CS | (xen_feature(XENFEAT_supervisor_mode_kernel)?0:1) ) #define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1) #define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8) -#define GET_KERNEL_DS() (__KERNEL_DS | (xen_feature(XENFEAT_ring0_kernel)?0:1) ) +#define GET_KERNEL_DS() (__KERNEL_DS | (xen_feature(XENFEAT_supervisor_mode_kernel)?0:1) ) #define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE + 4) #define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE + 5) diff --git a/xen/common/kernel.c b/xen/common/kernel.c index bbe66a4ede..56f2c21abf 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -193,7 +193,8 @@ long do_xen_version(int cmd, void *arg) if ( shadow_mode_translate(current->domain) ) fi.submap |= (1U << XENFEAT_writable_page_tables) | - (1U << XENFEAT_auto_translated_physmap); + (1U << XENFEAT_auto_translated_physmap) | + (1U << XENFEAT_pae_pgdir_above_4gb); break; default: return -EINVAL; diff --git a/xen/include/public/version.h b/xen/include/public/version.h index 55c5e8d147..5b68673d54 100644 --- a/xen/include/public/version.h +++ b/xen/include/public/version.h @@ -48,10 +48,34 @@ typedef struct xen_feature_info { uint32_t submap; /* OUT: 32-bit submap */ } xen_feature_info_t; +/* + * If set, the guest does not need to write-protect its pagetables, and can + * update them via direct writes. + */ #define XENFEAT_writable_page_tables 0 + +/* + * If set, the guest does not need to write-protect its segment descriptor + * tables, and can update them via direct writes. + */ #define XENFEAT_writable_descriptor_tables 1 + +/* + * If set, translation between the guest's 'pseudo-physical' address space + * and the host's machine address space are handled by the hypervisor. In this + * mode the guest does not need to perform phys-to/from-machine translations + * when performing page table operations. + */ #define XENFEAT_auto_translated_physmap 2 -#define XENFEAT_ring0_kernel 3 + +/* If set, the guest is running in supervisor mode (e.g., x86 ring 0). */ +#define XENFEAT_supervisor_mode_kernel 3 + +/* + * If set, the guest does not need to allocate x86 PAE page directories + * below 4GB. This flag is usually implied by auto_translated_physmap. + */ +#define XENFEAT_pae_pgdir_above_4gb 4 #define XENFEAT_NR_SUBMAPS 1 -- 2.30.2